package net.sdd.school.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import net.sdd.common.result.Result;
import net.sdd.school.entity.Course;
import net.sdd.school.entity.Trainer;
import net.sdd.school.service.ICourseService;
import net.sdd.school.service.ITrainerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/sddonline/index")
@Api(tags = "首页")
public class IndexController {

    @Autowired
    private ICourseService courseService;
    @Autowired
    private ITrainerService trainerService;

    /**
     * @Cacheable
     * 1、缓存注解，可以定义在方法上，自动把方法返回结果加入缓存
     * 2、方法的执行：
     *   2.1 先去缓存中查找数据，没有找到，就执行方法
     *   2.2 最后把执行方法返回的结果，自动加入缓存
     *   2.3 下一次再查找，就直接从缓存中找
     * 3、@Cacheable注解修饰的方法，会自动把方法返回的对象序列化存储到Redis中；
     * 4、注意：
     *   方法返回的对象，必须实现可序列化接口！否则，报错！
     *   如：public class Result implements Serializable
     *   且：Result中封装的对象，也要实现序列化接口
     */
    @GetMapping
    @ApiOperation("首页数据展示")
    @Cacheable(cacheNames = "index",key = "'data'")
    public Result getIndexData(){
        //1. 查询课程信息
        QueryWrapper<Course> wrapperCourse = new QueryWrapper<>();
        wrapperCourse.orderByDesc("create_time");
        wrapperCourse.last("limit 8");
        List<Course> courseList = courseService.list(wrapperCourse);

        //2. 查询培训师信息
        QueryWrapper<Trainer> wrapperTrainer = new QueryWrapper<>();
        wrapperTrainer.orderByDesc("create_time");
        wrapperTrainer.last("limit 4");
        List<Trainer> trainerList  = trainerService.list(wrapperTrainer);

        //3. 返回
        return Result.ok()
                .data("courseList",courseList)
                .data("trainerList",trainerList);
    }
}
